#ifndef __LIBCO_UTIL_H__
#define __LIBCO_UTIL_H__

#include <sys/syscall.h>
#include <unistd.h>
#include <string>
#include <chrono>
#include <iomanip>
#include <sstream>
#include "coroutine.hpp"

namespace libco {

/**
 * @brief 获取线程id
 * @note 返回系统内唯一id
 */
pid_t GetThreadId();

/**
 * @brief 获取协程id
 */
uint64_t GetCoroutineId();

/**
 * @brief 获取运行协程角色
 */
std::string GetCoroutineRole();

/**
 * @brief 获取当前启动的毫秒数
 */
double GetElapsedMs();

/**
 * @brief 获取当前启动的微秒数
 */
double GetElapsedUs();

/**
 * @brief 获取当前启动的纳秒数
 */
double GetElapsedNs();

/**
 * @brief 获取线程名称，参考pthread_getname_np(3)
 */
std::string GetThreadName();

/**
 * @brief 设置线程名称，参考pthread_setname_np(3)
 * @note 线程名称不能超过16字节，包括结尾的'\0'字符
 */
void SetThreadName(const std::string &name);

/**
 * @brief 获取当前时间
 * 
 * @return uint64_t
 */
uint64_t GetCurrentTimeMs();

/**
 * @brief 获取当前时间
 * 
 * @return std::string 
 */
std::string GetCurrentTimeStr();

} // namespace libco

#endif // __LIBCO_UTIL_H__